package org.xmap.net;

import java.util.Hashtable;

/**
 * 用于封装Http请求的对象 包含URL,Method,PostData,Headers等信息
 */
public class HttpRequest {

    private URL url;
    private String method;
    private Hashtable headers;
    private byte[] postData;

    /**
     * @param url 要请求的URL地址
     * @param method 请求的方法("GET" or "POST")
     * @param postData 需要Post的数据,如果不需要Post数据的话可以设置为null
     * @param headers 请求的Header信息,可以为null
     */
    public HttpRequest(String url, String method, Hashtable headers, byte[] postData) {
        url = HttpRequest.processUrl(url);
        this.url = new URL(url);
        this.method = method.toUpperCase();
        this.postData = postData;
        this.headers = headers;
    }

    /**
     * 增加HttpRequest对象的Header信息
     * @param key 名称
     * @param value 值
     */
    public void addHeader(String key, String value) {
        if (headers == null) {
            headers = new Hashtable();
        }
        this.headers.remove(key);
        this.headers.put(key, value);
    }

    /**
     * 获取HttpRequest对象里的Header信息
     * @return Hashtable
     */
    public Hashtable getHeaders() {
        return headers;
    }

    /**
     * 设置HttpRequest对象里的Header信息
     * @param headersTable (Hashtable)
     */
    public void setHeaders(Hashtable headersTable) {
        headers = headersTable;
    }

    /**
     * 获取HttpRequest对象里的请求方法
     * @return String ("GET" or "POST")
     */
    public String getMethod() {
        return method;
    }

    /**
     * 设置HttpRequest对象里的请求方法
     * @param strMethod String ("GET" or "POST")
     */
    public void setMethod(String strMethod) {
        method = strMethod;
    }

    /**
     * 获取HttpRequest对象的Post数据
     * @return byte[](要Post的数据)
     */
    public byte[] getPostData() {
        return postData;
    }

    /**
     * 设置HttpRequest对象的Post数据
     * @param postdata byte[](要Post的数据)
     */
    public void setPostData(byte[] postdata) {
        postData = postdata;
    }

    /**
     * 获取HttpRequest对象要请求的URL地址
     * @return String (要请求的URL)
     */
    public URL getUrl() {
        return this.url;
    }

    /**
     * 从原字符串中找到指定的字符串,替换成另外的字符串
     * @param s
     * @param s1
     * @param s2
     * @param ignoreCase 是否忽略大小写
     * @return
     */
    public static String RepStringX(String source, String from, String to, boolean ignoreCase) {
        if (source == null || from == null || to == null) {
            return source;
        }
        String tmp = "";
        int j;
        if (ignoreCase) {
            from = from.toLowerCase();
            int i;
            while ((i = source.toLowerCase().indexOf(from)) != -1) {
                String s3 = source.substring(0, i);
                String s5 = source.substring(i + from.length());
                tmp = tmp + s3 + to;
                source = s5;
            }
        } else {
            while ((j = source.indexOf(from)) != -1) {
                String s4 = source.substring(0, j);
                String s6 = source.substring(j + from.length());
                tmp = tmp + s4 + to;
                source = s6;
            }
        }
        return tmp + source;
    }

    /**
     * 从原字符串中找到指定的字符串,替换成另外的字符串,不忽略大小写
     * @param s
     * @param s1
     * @param s2
     * @return
     */
    public static String RepString(String source, String from, String to) {
        return RepStringX(source, from, to, false);
    }

    public static String processUrl(String url) {
        url = HttpRequest.RepString(url, "&amp;", "&");
        url = HttpRequest.RepString(url, " ", "%20");
        if (!url.startsWith("http://")) {
            url = "http://" + url;
        }
        return url;
    }
}
